package stockscreener.controlador;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import stockscreener.extracao.bovespa.ColetorBovespa;
import stockscreener.extracao.bovespa.ParserBovespa;
import stockscreener.negocio.BalancoPatrimonial;
import stockscreener.negocio.DemonstracaoDoResultadoDoExercicio;
import stockscreener.negocio.Empresa;
import stockscreener.persistencia.BalancoPatrimonialDAO;
import stockscreener.persistencia.DemonstracaoDoResultadoDoExercicioDAO;
import stockscreener.util.StockScreenerApplicationContext;

public class ControladorDadosEconomicosFinanceiros {

	@Transactional(rollbackFor = Exception.class)
	public void salvaBalancoPatrimonial(BalancoPatrimonial bp) {

		BalancoPatrimonialDAO.get().salva(bp);
	}

	public List obtemTodosBalacosPatrimoniais() {

		return BalancoPatrimonialDAO.get().obtemTodos();
	}

	@Transactional(rollbackFor = Exception.class)
	public void salvaDemonstracaoDoResultadoDoExercicio(DemonstracaoDoResultadoDoExercicio dre) {

		DemonstracaoDoResultadoDoExercicioDAO.get().salva(dre);
	}
	
	@Transactional(rollbackFor = Exception.class)
	public void carregarDadosEconomicosFinanceiros() {
		List<Empresa> empresas = ControladorEmpresa.get().obtemTodos();
		ArrayList<BalancoPatrimonial> balancos;
		ArrayList<DemonstracaoDoResultadoDoExercicio> dres;

		for (Empresa empresa : empresas) {

			balancos = new ArrayList<BalancoPatrimonial>();
			dres = new ArrayList<DemonstracaoDoResultadoDoExercicio>();
			
			ParserBovespa.parseDadosEconomicosFinanceirosENumeroDeAcoes(ColetorBovespa
					.recuperarDadosEconomicosFinanceiros(empresa), empresa,
					balancos, dres);

			for (BalancoPatrimonial bp : balancos) {
				List<BalancoPatrimonial> bpBancoDeDados = BalancoPatrimonialDAO
						.get().obtemPorDataEEmpresa(bp.getData(), empresa);

				if (bpBancoDeDados == null || bpBancoDeDados.size() == 0) {
					salvaBalancoPatrimonial(bp);
				}
			}
			
			for (DemonstracaoDoResultadoDoExercicio dre : dres) {
				List<DemonstracaoDoResultadoDoExercicio> dresBancoDeDados = DemonstracaoDoResultadoDoExercicioDAO
						.get().obtemPorDataEEmpresa(dre.getDataFinal(), empresa);

				if (dresBancoDeDados == null || dresBancoDeDados.size() == 0) {
					salvaDemonstracaoDoResultadoDoExercicio(dre);
				}
			}

		}
	}

	public BalancoPatrimonial obterUltimoBalancoPatrimonial(Empresa empresa) {
		BalancoPatrimonial ultimoBalancoPatrimonial = null;
		List<BalancoPatrimonial> balancos = BalancoPatrimonialDAO.get().obterPorEmpresaEmOrdemDecrescenteDeData(empresa);
		if (balancos != null && balancos.size() > 0) {
			ultimoBalancoPatrimonial = balancos.get(0);
		}
		
		return ultimoBalancoPatrimonial;
	}
	
	public DemonstracaoDoResultadoDoExercicio obterUltimaDemonstracaoDeResultadoDoExercicio(Empresa empresa) {
		DemonstracaoDoResultadoDoExercicio ultimaDRE = null;
		List<DemonstracaoDoResultadoDoExercicio> dres = DemonstracaoDoResultadoDoExercicioDAO.get().obterPorEmpresaEmOrdemDecrescenteDeData(empresa);
		if (dres != null && dres.size() > 0) {
			ultimaDRE = dres.get(0);
		}
		
		return ultimaDRE;
	}
	
	public static ControladorDadosEconomicosFinanceiros get() {

		return (ControladorDadosEconomicosFinanceiros) StockScreenerApplicationContext
				.getBean(ControladorDadosEconomicosFinanceiros.class);
	}
}
